home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / userbox / publicdomain / superplay-lib_dev / programmers / example_spobjects / st / sp_player.a < prev    next >
Encoding:
Text File  |  1996-05-27  |  26.9 KB  |  1,348 lines

  1.  
  2.  ; * SP_Player.asm (ST.spobject)
  3.  
  4.  ; * New SoundTracker/ProTracker player routine for ST.spobject.
  5.  ; *
  6.  ; * Modified for use with superplay.library in 1994-95 by
  7.  ; * Andreas R. Kleinert.
  8.  ; *
  9.  ; * Also made some important changes to be able to assemble it
  10.  ; * with SAS/ASM V6.55.
  11.  ; *
  12.  ; * Last Changes in Source : 21.10.1995
  13.  
  14.  ; * Assembler : ASM (part of SAS/C V6.55). No special options.
  15.  
  16.  ; * CREDITS :
  17.  
  18.  ; * ProTracker2.2a replay routine by Crayon/Noxious. Improved and modified
  19.  ; * by Teeme of Fist! Unlimited in 1992. Share and enjoy! :)
  20.  ; * Rewritten for Devpac (slightly..) by CJ. Devpac does not like bsr.L
  21.  ; * cmpi is compare immediate, it requires immediate data! And some
  22.  ; * labels had upper/lower case wrong...
  23.  ; *
  24.  ; * Now improved to make it work better if CIA timed - thanks Marco!
  25.  
  26.  ; * Call Mt_data with A0 pointing to your module data...
  27.  
  28.  
  29.         SECTION "SP_Player",CODE
  30.  
  31.         INCLUDE "exec/execbase.i"
  32.         INCLUDE "exec/libraries.i"
  33.         INCLUDE "exec/memory.i"
  34.         INCLUDE "dos/dos.i"
  35.  
  36.     XREF _ST_Module
  37.     XREF _ST_Len
  38.     XREF _ST_RunState
  39.  
  40.         XREF _STP_LoadModule
  41.  
  42.         XREF _SysBase  
  43.         XREF _DOSBase
  44.  
  45.         XREF _LVOOpen           ; from lib-code (DOS)
  46.         XREF _LVOClose
  47.         XREF _LVORead
  48.         XREF _LVOSeek
  49.  
  50.         XREF _LVOFreeVec
  51.         XREF _LVOAddIntServer
  52.         XREF _LVORemIntServer
  53.  
  54. TRUE             EQU 1          ; TRUE/FALSE equivalents
  55. FALSE            EQU 0          ; (e.g. for ST_RunState)
  56.  
  57. DMACON           EQU $DFF096    ; DMA-Register
  58.  
  59. AUD0LCH          EQU $DFF0A0    ; Sample-Data (Channel 0-3)
  60. AUD1LCH          EQU $DFF0B0
  61. AUD2LCH          EQU $DFF0C0
  62. AUD3LCH          EQU $DFF0D0
  63.  
  64. AUD0LEN          EQU $DFF0A4    ; Sample-Length (Channel 0-3)
  65. AUD1LEN          EQU $DFF0B4
  66. AUD2LEN          EQU $DFF0C4
  67. AUD3LEN          EQU $DFF0D4
  68.  
  69. AUD0VOL          EQU $DFF0A8    ; Volume (Channel 0-3)
  70. AUD1VOL          EQU $DFF0B8
  71. AUD2VOL          EQU $DFF0C8
  72. AUD3VOL          EQU $DFF0D8
  73.  
  74.  
  75.    ; *** MANAGEMENT ROUTINES ***
  76.  
  77. _ST_FreeModule:
  78.  
  79.     move.l    _ST_Module,d0        ; ST_Module to d0 and test
  80.     beq     return               ; return, if ModulePtr is NULL
  81.  
  82.     move.l    d0,a1                ; Buffer : ST_Module 
  83.     LINKLIB _LVOFreeVec,_SysBase
  84.  
  85.     clr.l    _ST_Module
  86.  
  87.     rts
  88.  
  89.  ; * end of Routine ST_FreeModule
  90.  
  91.  
  92. _ST_IsPlaying:
  93.     move.l    _ST_RunState,d0
  94.     rts
  95.  
  96.  ; * end of Routine ST_IsPlaying
  97.  
  98.  
  99. _ST_UnLoadModule:
  100.     bsr.s    _ST_Stop       ; subroutine ST_Stop
  101.     bra    _ST_FreeModule ; branch to ST_FreeModule
  102.  
  103.  ; * end of Routine ST_UnLoadModule
  104.  
  105.  
  106. _ST_Start
  107.     tst.l    _ST_Module             ; test ST_Module
  108.     beq.s   return                 ; return, if ModulePtr is NULL
  109.  
  110.     tst.l    _ST_RunState           ; test ST_RunState
  111.     bne.s    return                 ; return, if already running
  112.  
  113.     move.l  #TRUE,_ST_RunState     ; set ST_RunState as TRUE
  114.     jmp    mt_start               ; now branch to mt_start (rts there)
  115.  
  116.  ; * end of Routine ST_Start
  117.  
  118.  
  119. _ST_Stop
  120.     tst.l    _ST_Module       ; test ST_Module
  121.     beq.s   return           ; return, if ModulePtr is NULL
  122.  
  123.     tst.l    _ST_RunState     ; test ST_RunState
  124.     beq.s   return           ; return, if not running
  125.  
  126.     clr.l    _ST_RunState     ; now we don't run any longer
  127.     jmp    mt_brems
  128.  
  129.  ; * end of Routine ST_Stop
  130.  
  131.  
  132.  ; * used by many of the Routines above to rts
  133.  
  134. return:    rts
  135.  
  136.  
  137.    ; *** PLAYER ROUTINES ***
  138.  
  139.         cnop 0,4
  140. mt_start:
  141.         movem.l d0-d2/a0-a6,-(sp)         ; save registers
  142.  
  143.         bsr     MT_Init                   ; subroutine MT_Init
  144.  
  145.         moveq   #5,d0                     ; IntNumber (d0) : 5
  146.         lea     intnode(pc),a1            ; Interrupt (a1) : intnode
  147.  
  148.     LINKLIB _LVOAddIntServer,_SysBase ; AddIntServer !
  149.  
  150.         movem.l (sp)+,d0-d2/a0-a6         ; restore registers
  151.         rts
  152.  
  153. mt_brems:
  154.         movem.l d0/a1-a6,-(sp)
  155.  
  156.         moveq   #5,d0                     ; IntNumber (d0) : 5
  157.         lea     intnode(pc),a1            ; Interrupt (a1) : intnode
  158.  
  159.     LINKLIB _LVORemIntServer,_SysBase ; RemIntServer !
  160.  
  161.         bsr     MT_End                    ; sub_routine MT_End
  162.  
  163.         movem.l (sp)+,d0/a1-a6
  164.         rts
  165.  
  166.  
  167. ; * MT_Init  : The initialization routine (to be called once)
  168. ; * MT_Call : The Interrupt-Player-Routine (to be called every frame)
  169.  
  170. N_Note          EQU 0    ; W
  171. N_Cmd           EQU 2    ; W
  172. N_Cmdlo         EQU 3    ; B
  173. N_Start         EQU 4    ; L
  174. N_Length        EQU 8    ; W
  175. N_LoopStart     EQU 10   ; L
  176. N_Replen        EQU 14   ; W
  177. N_Period        EQU 16   ; W
  178. N_FineTune      EQU 18   ; B
  179. N_Volume        EQU 19   ; B
  180. N_DMABit        EQU 20   ; W
  181. N_TonePortDirec EQU 22   ; B
  182. N_TonePortSpeed EQU 23   ; B
  183. N_WantedPeriod  EQU 24   ; W
  184. N_VibratoCmd    EQU 26   ; B
  185. N_VibratoPos    EQU 27   ; B
  186. N_TremoloCmd    EQU 28   ; B
  187. N_TremoloPos    EQU 29   ; B
  188. N_WaveControl   EQU 30   ; B
  189. N_GlissFunk     EQU 31   ; B
  190. N_SampleOffset  EQU 32   ; B
  191. N_PattPos       EQU 33   ; B
  192. N_LoopCount     EQU 34   ; B
  193. N_FunkOffset    EQU 35   ; B
  194. N_WaveStart     EQU 36   ; L
  195. N_RealLength    EQU 40   ; W
  196. MT_SongDataPtr  EQU -18
  197. MT_Speed        EQU -14
  198. MT_Counter      EQU -13
  199. MT_SongPos      EQU -12
  200. MT_PBreakPos    EQU -11
  201. MT_PosJumpFlag  EQU -10
  202. MT_PBreakFlag   EQU -9
  203. MT_LowMask      EQU -8
  204. MT_PattDelTime  EQU -7
  205. MT_PattDelTime2 EQU -6
  206. MT_PatternPos   EQU -4
  207. MT_DMACONTemp   EQU -2
  208.  
  209.  
  210. MT_Init:
  211.         move.l  _ST_Module,a0         ; AK : added 29.03.94
  212.      lea    Variables,a5          ; AK : inserted 29.03.94
  213.  
  214.     move.l    a0,MT_SongDataPtr(a5)
  215.     lea    952(a0),a1
  216.     moveq    #127,D0
  217.     moveq    #0,D1
  218. MTLoop:
  219.     move.l    d1,d2
  220.     subq.w    #1,d0
  221. MTLoop2:
  222.     move.b    (a1)+,d1
  223.     cmp.b    d2,d1
  224.     bgt.s    MTLoop
  225.     dbf    d0,MTLoop2
  226.     addq.b    #1,d2
  227.             
  228.     move.l    a5,a1
  229.     suba.w    #142,a1
  230.     asl.l    #8,d2
  231.     asl.l    #2,d2
  232.     addi.l    #1084,d2
  233.     add.l    a0,d2
  234.     move.l    d2,a2
  235.     moveq    #30,d0
  236. MTLoop3:
  237.     clr.l    (a2)
  238.     move.l    a2,(a1)+
  239.     moveq    #0,d1
  240.     move.w    42(a0),d1
  241.     add.l    d1,d1
  242.     add.l    d1,a2
  243.     adda.w    #30,a0
  244.     dbf    d0,MTLoop3
  245.  
  246.     ori.b    #2,$bfe001
  247.     move.b    #6,MT_Speed(a5)
  248.     clr.b    MT_Counter(a5)
  249.     clr.b    MT_SongPos(a5)
  250.     clr.w    MT_PatternPos(a5)
  251. MT_End:
  252.         ; changed in 29.03.94 (AK)
  253.  
  254.         clr.w   AUD0VOL           ; AUD0VOL = 0;
  255.         clr.w   AUD1VOL           ; AUD1VOL = 0;
  256.         clr.w   AUD2VOL           ; AUD2VOL = 0;
  257.         clr.w   AUD3VOL           ; AUD3VOL = 0;
  258.  
  259.         move.w  #$f,DMACON        ; DMA : Channel 0-3 OFF
  260.  
  261.         rts
  262.  
  263. ; * The INTERRUPT-Player-Routine (to be called every frame)
  264.  
  265. MT_Call:
  266.     movem.l    d0-d7/a0-a6,-(sp) ; save registers (interrupt entry)
  267.  
  268.         bsr.s   MT_Music          ; subroutine mt_music
  269.  
  270.     movem.l    (sp)+,d0-d7/a0-a6 ; restore registers
  271.  
  272.         moveq #0,d0
  273.  
  274.         rts
  275.  
  276. MT_Music:
  277.      lea    Variables,a5          ; AK : inserted 29.03.94
  278.         lea     $dff000,a6            ; AK : inserted 29.03.94
  279.  
  280. VBlankLoop:                     ;                       AK : inserted 29.03.94
  281.     cmpi.b    #$40,$dff006    ;should use WaitTOF()   AK : inserted 29.03.94
  282.     bne.s    VBlankLoop    ;from graphics.library  AK : inserted 29.03.94
  283.  
  284.     addq.b    #1,MT_Counter(a5)
  285.     move.b    MT_Counter(a5),d0
  286.     cmp.b    MT_Speed(a5),d0
  287.     blo.s    MT_NoNewNote
  288.     clr.b    MT_Counter(a5)
  289.     tst.b    MT_PattDelTime2(a5)
  290.     beq.s    MT_GetNewNote
  291.     bsr.s    MT_NoNewAllChannels
  292.     bra    MT_Dskip
  293.  
  294. MT_NoNewNote:
  295.     bsr.s    MT_NoNewAllChannels
  296.     bra    MT_NoNewPosYet
  297. MT_NoNewAllChannels:
  298.     move.w    #$a0,d5
  299.     move.l    a5,a4
  300.     suba.w    #318,a4
  301.     bsr    MT_CheckEfx
  302.     move.w    #$b0,d5
  303.     adda.w    #44,a4
  304.     bsr    MT_CheckEfx
  305.     move.w    #$c0,d5
  306.     adda.w    #44,a4
  307.     bsr    MT_CheckEfx
  308.     move.w    #$d0,d5
  309.     adda.w    #44,a4
  310.     bra    MT_CheckEfx
  311. MT_GetNewNote:
  312.     move.l    MT_SongDataPtr(a5),a0
  313.     lea    12(a0),a3
  314.     lea    952(a0),a2    ;pattpo
  315.     lea    1084(a0),a0    ;patterndata
  316.     moveq    #0,d0
  317.     moveq    #0,d1
  318.     move.b    MT_SongPos(a5),d0
  319.     move.b    0(a2,d0.w),d1
  320.     asl.l    #8,d1
  321.     asl.l    #2,d1
  322.     add.w    MT_PatternPos(a5),d1
  323.     clr.w    MT_DMACONTemp(a5)
  324.  
  325.     move.w    #$a0,d5
  326.     move.l    a5,a4
  327.     suba.w    #318,a4
  328.     bsr.s    MT_PlayVoice
  329.     move.w    #$b0,d5
  330.     adda.w    #44,a4
  331.     bsr.s    MT_PlayVoice
  332.     move.w    #$c0,d5
  333.     adda.w    #44,a4
  334.     bsr.s    MT_PlayVoice
  335.     move.w    #$d0,d5
  336.     adda.w    #44,a4
  337.     bsr.s    MT_PlayVoice
  338.     bra    MT_SetDMA
  339.  
  340. MT_PlayVoice:
  341.     tst.l    (a4)
  342.     bne.s    MT_PlvSkip
  343.     bsr    MT_PerNop
  344. MT_PlvSkip:
  345.     move.l    0(a0,d1.l),(a4)
  346.     addq.l    #4,d1
  347.     moveq    #0,d2
  348.     move.b    N_Cmd(a4),d2
  349.     andi.b    #$f0,d2
  350.     lsr.b    #4,d2
  351.     move.b    (a4),d0
  352.     andi.b    #$f0,d0
  353.     or.b    d0,d2
  354.     beq    MT_SetRegs
  355.     moveq    #0,d3
  356.     move.l    a5,a1
  357.     suba.w    #142,a1
  358.     move    d2,d4
  359.     subq.l    #1,d2
  360.     asl.l    #2,d2
  361.     mulu    #30,d4
  362.     move.l    0(a1,d2.l),N_Start(a4)
  363.     move.w    0(a3,d4.l),N_Length(a4)
  364.     move.w    0(a3,d4.l),N_RealLength(a4)
  365.     move.b    2(a3,d4.l),N_FineTune(a4)
  366.     move.b    3(a3,d4.l),N_Volume(a4)
  367.     move.w    4(a3,d4.l),d3 ; Get repeat
  368.     beq.s    MT_NoLoop
  369.     move.l    N_Start(a4),d2 ; Get start
  370.     add.w    d3,d3
  371.     add.l    d3,d2        ; Add repeat
  372.     move.l    d2,N_LoopStart(a4)
  373.     move.l    d2,N_WaveStart(a4)
  374.     move.w    4(a3,d4.l),d0    ; Get repeat
  375.     add.w    6(a3,d4.l),d0    ; Add replen
  376.     move.w    d0,N_Length(a4)
  377.     move.w    6(a3,d4.l),N_Replen(a4)    ; Save replen
  378.     moveq    #0,d0
  379.     move.b    N_Volume(a4),d0
  380.     move.w    d0,8(a6,d5.w)    ; Set volume
  381.     bra.s    MT_SetRegs
  382.  
  383. MT_NoLoop:
  384.     move.l    N_Start(a4),d2
  385.     add.l    d3,d2
  386.     move.l    d2,N_LoopStart(a4)
  387.     move.l    d2,N_WaveStart(a4)
  388.     move.w    6(a3,d4.l),N_Replen(a4)    ; Save replen
  389.     moveq    #0,d0
  390.     move.b    N_Volume(a4),d0
  391.     move.w    d0,8(a6,d5.w)    ; Set volume
  392. MT_SetRegs:
  393.     move.w    (a4),d0
  394.     andi.w    #$0fff,d0
  395.     beq    MT_CheckMoreEfx    ; If no note
  396.     move.w    2(a4),d0
  397.     andi.w    #$0ff0,d0
  398.     cmpi.w    #$0e50,d0
  399.     beq.s    MT_DoSetFineTune
  400.     move.b    2(a4),d0
  401.     andi.b    #$0f,d0
  402.     cmpi.b    #3,d0    ; TonePortamento
  403.     beq.s    MT_ChkTonePorta
  404.     cmpi.b    #5,d0
  405.     beq.s    MT_ChkTonePorta
  406.     cmpi.b    #9,d0    ; Sample Offset
  407.     bne.s    MT_SetPeriod
  408.     bsr    MT_CheckMoreEfx
  409.     bra.s    MT_SetPeriod
  410.  
  411. MT_DoSetFineTune:
  412.     bsr    MT_SetFineTune
  413.     bra.s    MT_SetPeriod
  414.  
  415. MT_ChkTonePorta:
  416.     bsr    MT_SetTonePorta
  417.     bra    MT_CheckMoreEfx
  418.  
  419. MT_SetPeriod:
  420.     movem.l d0-d1/a0-a1,-(sp)
  421.     move.w    (a4),d1
  422.     andi.w    #$0fff,d1
  423.     lea    MT_PeriodTable(pc),a1
  424.     moveq    #0,d0
  425.     moveq    #36,d7
  426. MT_FtuLoop:
  427.     cmp.w    0(a1,d0.w),d1
  428.     bhs.s    MT_FtuFound
  429.     addq.l    #2,d0
  430.     dbf    d7,MT_FtuLoop
  431. MT_FtuFound:
  432.     moveq    #0,d1
  433.     move.b    N_FineTune(a4),d1
  434.     mulu    #72,d1
  435.     add.l    d1,a1
  436.     move.w    0(a1,d0.w),N_Period(a4)
  437.     movem.l    (sp)+,d0-d1/a0-a1
  438.  
  439.     move.w    2(a4),d0
  440.     andi.w    #$0ff0,d0
  441.     cmpi.w    #$0ed0,d0 ; Notedelay
  442.     beq    MT_CheckMoreEfx
  443.  
  444.     move.w    N_DMABit(a4),$096(a6)
  445.     btst    #2,N_WaveControl(a4)
  446.     bne.s    MT_Vibnoc
  447.     clr.b    N_VibratoPos(a4)
  448. MT_Vibnoc:
  449.     btst    #6,N_WaveControl(a4)
  450.     bne.s    MT_Trenoc
  451.     clr.b    N_TremoloPos(a4)
  452. MT_Trenoc:
  453.     move.l    N_Start(a4),0(a6,d5.w)    ; Set start
  454.     move.w    N_Length(a4),4(a6,d5.w)    ; Set length
  455.     move.w    N_Period(a4),d0
  456.     move.w    d0,6(a6,d5.w)        ; Set period
  457.     move.w    N_DMABit(a4),d0
  458.     or.w    d0,MT_DMACONTemp(a5)
  459.     bra    MT_CheckMoreEfx
  460.  
  461. MT_SetDMA:
  462.     bsr    MT_DMAWaitLoop
  463.     move.w    MT_DMACONTemp(a5),d0
  464.     ori.w    #$8000,d0
  465.     move.w    d0,$096(a6)
  466.     bsr    MT_DMAWaitLoop
  467.     move.l    a5,a4
  468.     suba.w    #186,a4
  469.     move.l    N_LoopStart(a4),$d0(a6)
  470.     move.w    N_Replen(a4),$d4(a6)
  471.     suba.w    #44,a4
  472.     move.l    N_LoopStart(a4),$c0(a6)
  473.     move.w    N_Replen(a4),$c4(a6)
  474.     suba.w    #44,a4
  475.     move.l    N_LoopStart(a4),$b0(a6)
  476.     move.w    N_Replen(a4),$b4(a6)
  477.     suba.w    #44,a4
  478.     move.l    N_LoopStart(a4),$a0(a6)
  479.     move.w    N_Replen(a4),$a4(a6)
  480.  
  481. MT_Dskip:
  482.     addi.w    #16,MT_PatternPos(a5)
  483.     move.b    MT_PattDelTime(a5),d0
  484.     beq.s    MT_Dskc
  485.     move.b    d0,MT_PattDelTime2(a5)
  486.     clr.b    MT_PattDelTime(a5)
  487. MT_Dskc:
  488.     tst.b    MT_PattDelTime2(a5)
  489.     beq.s    MT_Dska
  490.     subq.b    #1,MT_PattDelTime2(a5)
  491.     beq.s    MT_Dska
  492.     sub.w    #16,MT_PatternPos(a5)
  493. MT_Dska:
  494.     tst.b    MT_PBreakFlag(a5)
  495.     beq.s    MT_Nnpysk
  496.     clr.b    MT_PBreakFlag(a5)
  497.     moveq    #0,d0
  498.     move.b    MT_PBreakPos(a5),d0
  499.     clr.b    MT_PBreakPos(a5)
  500.     lsl.w    #4,d0
  501.     move.w    d0,MT_PatternPos(a5)
  502. MT_Nnpysk:
  503.     cmpi.w    #1024,MT_PatternPos(a5)
  504.     blo.s    MT_NoNewPosYet
  505. MT_NextPosition:    
  506.     moveq    #0,d0
  507.     move.b    MT_PBreakPos(a5),d0
  508.     lsl.w    #4,d0
  509.     move.w    d0,MT_PatternPos(a5)
  510.     clr.b    MT_PBreakPos(a5)
  511.     clr.b    MT_PosJumpFlag(a5)
  512.     addq.b    #1,MT_SongPos(a5)
  513.     andi.b    #$7F,MT_SongPos(a5)
  514.     move.b    MT_SongPos(a5),d1
  515.     move.l    MT_SongDataPtr(a5),a0
  516.     cmp.b    950(a0),d1
  517.     blo.s    MT_NoNewPosYet
  518.     clr.b    MT_SongPos(a5)
  519. MT_NoNewPosYet:    
  520.     tst.b    MT_PosJumpFlag(a5)
  521.     bne.s    MT_NextPosition
  522.  
  523.     rts
  524.  
  525. MT_CheckEfx:
  526.     bsr    MT_UpdateFunk
  527.     move.w    N_Cmd(a4),d0
  528.     andi.w    #$0fff,d0
  529.     beq.s    MT_PerNop
  530.     move.b    N_Cmd(a4),d0
  531.     andi.b    #$0f,d0
  532.     beq.s    MT_Arpeggio
  533.     cmpi.b    #1,d0
  534.     beq    MT_PortaUp
  535.     cmpi.b    #2,d0
  536.     beq    MT_PortaDown
  537.     cmpi.b    #3,d0
  538.     beq    MT_TonePortamento
  539.     cmpi.b    #4,d0
  540.     beq    MT_Vibrato
  541.     cmpi.b    #5,d0
  542.     beq    MT_TonePlusVolSlide
  543.     cmpi.b    #6,d0
  544.     beq    MT_VibratoPlusVolSlide
  545.     cmpi.b    #$E,d0
  546.     beq    MT_E_Commands
  547. SetBack:
  548.     move.w    N_Period(a4),6(a6,d5.w)
  549.     cmpi.b    #7,d0
  550.     beq    MT_Tremolo
  551.     cmpi.b    #$a,d0
  552.     beq    MT_VolumeSlide
  553. MT_Return2:
  554.     rts
  555.  
  556. MT_PerNop:
  557.     move.w    N_Period(a4),6(a6,d5.w)
  558.     rts
  559.  
  560. MT_Arpeggio:
  561.     moveq    #0,d0
  562.     move.b    MT_Counter(a5),d0
  563.     divs    #3,d0
  564.     swap    d0
  565.     tst.w    D0
  566.     beq.s    MT_Arpeggio2
  567.     cmpi.w    #2,d0
  568.     beq.s    MT_Arpeggio1
  569.     moveq    #0,d0
  570.     move.b    N_Cmdlo(a4),d0
  571.     lsr.b    #4,d0
  572.     bra.s    MT_Arpeggio3
  573.  
  574. MT_Arpeggio1:
  575.     moveq    #0,d0
  576.     move.b    N_Cmdlo(a4),d0
  577.     andi.b    #15,d0
  578.     bra.s    MT_Arpeggio3
  579.  
  580. MT_Arpeggio2:
  581.     move.w    N_Period(a4),d2
  582.     bra.s    MT_Arpeggio4
  583.  
  584. MT_Arpeggio3:
  585.     add.w    d0,d0
  586.     moveq    #0,d1
  587.     move.b    N_FineTune(a4),d1
  588.     mulu    #72,d1
  589.     lea    MT_PeriodTable(pc),a0
  590.     add.w    d1,a0
  591.     moveq    #0,d1
  592.     move.w    N_Period(a4),d1
  593.     moveq    #36,d7
  594. MT_ArpLoop:
  595.     move.w    0(a0,d0.w),d2
  596.     cmp.w    (a0),d1
  597.     bhs.s    MT_Arpeggio4
  598.     addq.w    #2,a0
  599.     dbf    d7,MT_ArpLoop
  600.     rts
  601.  
  602. MT_Arpeggio4:
  603.     move.w    d2,6(a6,d5.w)
  604.     rts
  605.  
  606. MT_FinePortaUp:
  607.     tst.b    MT_Counter(a5)
  608.     bne.s    MT_Return2
  609.     move.b    #$0f,MT_LowMask(a5)
  610. MT_PortaUp:
  611.     moveq    #0,d0
  612.     move.b    N_Cmdlo(a4),d0
  613.     and.b    MT_LowMask(a5),d0
  614.     st    MT_LowMask(a5)
  615.     sub.w    d0,N_Period(a4)
  616.     move.w    N_Period(a4),d0
  617.     andi.w    #$0fff,d0
  618.     cmpi.w    #113,d0
  619.     bpl.s    MT_PortaUskip
  620.     andi.w    #$f000,N_Period(a4)
  621.     ori.w    #113,N_Period(a4)
  622. MT_PortaUskip:
  623.     move.w    N_Period(a4),d0
  624.     andi.w    #$0fff,d0
  625.     move.w    d0,6(a6,d5.w)
  626.     rts
  627.  
  628. MT_FinePortaDown:
  629.     tst.b    MT_Counter(a5)
  630.     bne    MT_Return2
  631.     move.b    #$0f,MT_LowMask(a5)
  632. MT_PortaDown:
  633.     clr.w   d0
  634.     move.b    N_Cmdlo(a4),d0
  635.     and.b    MT_LowMask(a5),d0
  636.     st    MT_LowMask(a5)
  637.     add.w    d0,N_Period(a4)
  638.     move.w    N_Period(a4),d0
  639.     andi.w    #$0fff,d0
  640.     cmpi.w    #856,d0
  641.     bmi.s    MT_PortaDskip
  642.     andi.w    #$f000,N_Period(a4)
  643.     ori.w    #856,N_Period(a4)
  644. MT_PortaDskip:
  645.     move.w    N_Period(a4),d0
  646.     andi.w    #$0fff,d0
  647.     move.w    d0,6(a6,d5.w)
  648.     rts
  649.  
  650. MT_SetTonePorta:
  651.     move.l    a0,-(sp)
  652.     move.w    (a4),d2
  653.     andi.w    #$0fff,d2
  654.     moveq    #0,d0
  655.     move.b    N_FineTune(a4),d0
  656.     mulu    #74,d0
  657.     lea    MT_PeriodTable(pc),a0
  658.     add.w    d0,a0
  659.     moveq    #0,d0
  660. MT_StpLoop:
  661.     cmp.w    0(a0,d0.w),d2
  662.     bhs.s    MT_StpFound
  663.     addq.w    #2,d0
  664.     cmpi.w    #74,d0
  665.     blo.s    MT_StpLoop
  666.     moveq    #70,d0
  667. MT_StpFound:
  668.     move.b    N_FineTune(a4),d2
  669.     andi.b    #8,d2
  670.     beq.s    MT_StpGoss
  671.     tst.w    d0
  672.     beq.s    MT_StpGoss
  673.     subq.w    #2,d0
  674. MT_StpGoss:
  675.     move.w    0(a0,d0.w),d2
  676.     move.l    (sp)+,a0
  677.     move.w    d2,N_WantedPeriod(a4)
  678.     move.w    N_Period(a4),d0
  679.     clr.b    N_TonePortDirec(a4)
  680.     cmp.w    d0,d2
  681.     beq.s    MT_ClearTonePorta
  682.     bge    MT_Return2
  683.     move.b    #1,N_TonePortDirec(a4)
  684.     rts
  685.  
  686. MT_ClearTonePorta:
  687.     clr.w    N_WantedPeriod(a4)
  688.     rts
  689.  
  690. MT_TonePortamento:
  691.     move.b    N_Cmdlo(a4),d0
  692.     beq.s    MT_TonePortNoChange
  693.     move.b    d0,N_TonePortSpeed(a4)
  694.     clr.b    N_Cmdlo(a4)
  695. MT_TonePortNoChange:
  696.     tst.w    N_WantedPeriod(a4)
  697.     beq    MT_Return2
  698.     moveq    #0,d0
  699.     move.b    N_TonePortSpeed(a4),d0
  700.     tst.b    N_TonePortDirec(a4)
  701.     bne.s    MT_TonePortaUp
  702. MT_TonePortaDown:
  703.     add.w    d0,N_Period(a4)
  704.     move.w    N_WantedPeriod(a4),d0
  705.     cmp.w    N_Period(a4),d0
  706.     bgt.s    MT_TonePortaSetPer
  707.     move.w    N_WantedPeriod(a4),N_Period(a4)
  708.     clr.w    N_WantedPeriod(a4)
  709.     bra.s    MT_TonePortaSetPer
  710.  
  711. MT_TonePortaUp:
  712.     sub.w    d0,N_Period(a4)
  713.     move.w    N_WantedPeriod(a4),d0
  714.     cmp.w    N_Period(a4),d0         ; was cmpi!!!!
  715.     blt.s    MT_TonePortaSetPer
  716.     move.w    N_WantedPeriod(a4),N_Period(a4)
  717.     clr.w    N_WantedPeriod(a4)
  718.  
  719. MT_TonePortaSetPer:
  720.     move.w    N_Period(a4),d2
  721.     move.b    N_GlissFunk(a4),d0
  722.     andi.b    #$0f,d0
  723.     beq.s    MT_GlissSkip
  724.     moveq    #0,d0
  725.     move.b    N_FineTune(a4),d0
  726.     mulu    #72,d0
  727.     lea    MT_PeriodTable(pc),a0
  728.     add.w    d0,a0
  729.     moveq    #0,d0
  730. MT_GlissLoop:
  731.     cmp.w    0(a0,d0.w),d2
  732.     bhs.s    MT_GlissFound
  733.     addq.w    #2,d0
  734.     cmpi.w    #72,d0
  735.     blo.s    MT_GlissLoop
  736.     moveq    #70,d0
  737. MT_GlissFound:
  738.     move.w    0(a0,d0.w),d2
  739. MT_GlissSkip:
  740.     move.w    d2,6(a6,d5.w) ; Set period
  741.     rts
  742.  
  743. MT_Vibrato:
  744.     move.b    N_Cmdlo(a4),d0
  745.     beq.s    MT_Vibrato2
  746.     move.b    N_VibratoCmd(a4),d2
  747.     andi.b    #$0f,d0
  748.     beq.s    MT_VibSkip
  749.     andi.b    #$f0,d2
  750.     or.b    d0,d2
  751. MT_VibSkip:
  752.     move.b    N_Cmdlo(a4),d0
  753.     andi.b    #$f0,d0
  754.     beq.s    MT_VibSkip2
  755.     andi.b    #$0f,d2
  756.     or.b    d0,d2
  757. MT_VibSkip2:
  758.     move.b    d2,N_VibratoCmd(a4)
  759. MT_Vibrato2:
  760.     move.b    N_VibratoPos(a4),d0
  761.     lea    MT_VibratoTable(pc),a0
  762.     lsr.w    #2,d0
  763.     andi.w    #$001f,d0
  764.     moveq    #0,d2
  765.     move.b    N_WaveControl(a4),d2
  766.     andi.b    #$03,d2
  767.     beq.s    MT_Vib_Sine
  768.     lsl.b    #3,d0
  769.     cmpi.b    #1,d2
  770.     beq.s    MT_Vib_RampDown
  771.     st    d2
  772.     bra.s    MT_Vib_Set
  773. MT_Vib_RampDown:
  774.     tst.b    N_VibratoPos(a4)
  775.     bpl.s    MT_Vib_RampDown2
  776.     st    d2
  777.     sub.b    d0,d2
  778.     bra.s    MT_Vib_Set
  779. MT_Vib_RampDown2:
  780.     move.b    d0,d2
  781.     bra.s    MT_Vib_Set
  782. MT_Vib_Sine:
  783.     move.b    0(a0,d0.w),d2
  784. MT_Vib_Set:
  785.     move.b    N_VibratoCmd(a4),d0
  786.     andi.w    #15,d0
  787.     mulu    d0,d2
  788.     lsr.w    #7,d2
  789.     move.w    N_Period(a4),d0
  790.     tst.b    N_VibratoPos(a4)
  791.     bmi.s    MT_VibratoNeg
  792.     add.w    d2,d0
  793.     bra.s    MT_Vibrato3
  794. MT_VibratoNeg:
  795.     sub.w    d2,d0
  796. MT_Vibrato3:
  797.     move.w    d0,6(a6,d5.w)
  798.     move.b    N_VibratoCmd(a4),d0
  799.     lsr.w    #2,d0
  800.     andi.w    #$3C,d0
  801.     add.b    d0,N_VibratoPos(a4)
  802.     rts
  803.  
  804. MT_TonePlusVolSlide:
  805.     bsr    MT_TonePortNoChange
  806.     bra    MT_VolumeSlide
  807.  
  808. MT_VibratoPlusVolSlide:
  809.     bsr.s    MT_Vibrato2
  810.     bra    MT_VolumeSlide
  811.  
  812. MT_Tremolo:
  813.     move.b    N_Cmdlo(a4),d0
  814.     beq.s    MT_Tremolo2
  815.     move.b    N_TremoloCmd(a4),d2
  816.     andi.b    #$0f,d0
  817.     beq.s    MT_TreSkip
  818.     andi.b    #$f0,d2
  819.     or.b    d0,d2
  820. MT_TreSkip:
  821.     move.b    N_Cmdlo(a4),d0
  822.     and.b    #$f0,d0
  823.     beq.s    MT_TreSkip2
  824.     andi.b    #$0f,d2
  825.     or.b    d0,d2
  826. MT_TreSkip2:
  827.     move.b    d2,N_TremoloCmd(a4)
  828. MT_Tremolo2:
  829.     move.b    N_TremoloPos(a4),d0
  830.     lea    MT_VibratoTable(pc),a0
  831.     lsr.w    #2,d0
  832.     andi.w    #$1f,d0
  833.     moveq    #0,d2
  834.     move.b    N_WaveControl(a4),d2
  835.     lsr.b    #4,d2
  836.     andi.b    #3,d2
  837.     beq.s    MT_Tre_Sine
  838.     lsl.b    #3,d0
  839.     cmpi.b    #1,d2
  840.     beq.s    MT_Tre_RampDown
  841.     st    d2
  842.     bra.s    MT_Tre_Set
  843. MT_Tre_RampDown:
  844.     tst.b    N_VibratoPos(a4)
  845.     bpl.s    MT_Tre_RampDown2
  846.     st    d2
  847.     sub.b    d0,d2
  848.     bra.s    MT_Tre_Set
  849. MT_Tre_RampDown2:
  850.     move.b    d0,d2
  851.     bra.s    MT_Tre_Set
  852. MT_Tre_Sine:
  853.     move.b    0(a0,d0.w),d2
  854. MT_Tre_Set:
  855.     move.b    N_TremoloCmd(a4),d0
  856.     andi.w    #15,d0
  857.     mulu    d0,d2
  858.     lsr.w    #6,d2
  859.     moveq    #0,d0
  860.     move.b    N_Volume(a4),d0
  861.     tst.b    N_TremoloPos(a4)
  862.     bmi.s    MT_TremoloNeg
  863.     add.w    d2,d0
  864.     bra.s    MT_Tremolo3
  865. MT_TremoloNeg:
  866.     sub.w    d2,d0
  867. MT_Tremolo3:
  868.     bpl.s    MT_TremoloSkip
  869.     clr.w   d0
  870. MT_TremoloSkip:
  871.     cmpi.w    #$40,d0
  872.     bls.s    MT_TremoloOk
  873.     move.w    #$40,d0
  874. MT_TremoloOk:
  875.     move.w    d0,8(a6,d5.w)
  876.     move.b    N_TremoloCmd(a4),d0
  877.     lsr.w    #2,d0
  878.     andi.w    #$3c,d0
  879.     add.b    d0,N_TremoloPos(a4)
  880.     rts
  881.  
  882. MT_SampleOffset:
  883.     moveq    #0,d0
  884.     move.b    N_Cmdlo(a4),d0
  885.     beq.s    MT_SoNoNew
  886.     move.b    d0,N_SampleOffset(a4)
  887. MT_SoNoNew:
  888.     move.b    N_SampleOffset(a4),d0
  889.     lsl.w    #7,d0
  890.     cmp.w    N_Length(a4),d0
  891.     bge.s    MT_SofSkip
  892.     sub.w    d0,N_Length(a4)
  893.     add.w    d0,d0
  894.     add.l    d0,N_Start(a4)
  895.     rts
  896. MT_SofSkip:
  897.     move.w    #1,N_Length(a4)
  898.     rts
  899.  
  900. MT_VolumeSlide:
  901.     moveq    #0,d0
  902.     move.b    N_Cmdlo(a4),d0
  903.     lsr.b    #4,d0
  904.     tst.b    d0
  905.     beq.s    MT_VolSlideDown
  906. MT_VolSlideUp:
  907.     add.b    d0,N_Volume(a4)
  908.     cmpi.b    #$40,N_Volume(a4)
  909.     bmi.s    MT_VsuSkip
  910.     move.b    #$40,N_Volume(a4)
  911. MT_VsuSkip:
  912.     move.b    N_Volume(a4),d0
  913.     move.w    d0,8(a6,d5.w)
  914.     rts
  915.  
  916. MT_VolSlideDown:
  917.     moveq    #0,d0
  918.     move.b    N_Cmdlo(a4),d0
  919.     andi.b    #$0f,d0
  920. MT_VolSlideDown2:
  921.     sub.b    d0,N_Volume(a4)
  922.     bpl.s    MT_VsdSkip
  923.     clr.b    N_Volume(a4)
  924. MT_VsdSkip:
  925.     move.b    N_Volume(a4),d0
  926.     move.w    d0,8(a6,d5.w)
  927.     rts
  928.  
  929. MT_PositionJump:
  930.     move.b    N_Cmdlo(a4),MT_SongPos(a5)
  931.     subq.b    #1,MT_SongPos(a5)
  932. MT_PJ2:
  933.     clr.b    MT_PBreakPos(a5)
  934.     st     MT_PosJumpFlag(a5)
  935.     rts
  936.  
  937. MT_VolumeChange:
  938.     moveq    #0,d0
  939.     move.b    N_Cmdlo(a4),d0
  940.     cmpi.b    #$40,d0
  941.     bls.s    MT_VolumeOk
  942.     moveq    #$40,d0
  943. MT_VolumeOk:
  944.     move.b    d0,N_Volume(a4)
  945.     move.w    d0,8(a6,d5.w)
  946.     rts
  947.  
  948. MT_PatternBreak:
  949.     moveq    #0,d0
  950.     move.b    N_Cmdlo(a4),d0
  951.     move.l    d0,d2
  952.     lsr.b    #4,d0
  953.     mulu    #10,d0
  954.     andi.b    #$0f,d2
  955.     add.b    d2,d0
  956.     cmpi.b    #63,d0
  957.     bhi.s    MT_PJ2
  958.     move.b    d0,MT_PBreakPos(a5)
  959.     st    MT_PosJumpFlag(a5)
  960.     rts
  961.  
  962. MT_SetSpeed:
  963.     move.b    3(a4),d0
  964.     beq    MT_Return2
  965.     clr.b    MT_Counter(a5)
  966.     move.b    d0,MT_Speed(a5)
  967.     rts
  968.  
  969. MT_CheckMoreEfx:
  970.     bsr    MT_UpdateFunk
  971.     move.b    2(a4),d0
  972.     andi.b    #$0f,d0
  973.     cmpi.b    #$9,d0
  974.     beq    MT_SampleOffset
  975.     cmpi.b    #$b,d0
  976.     beq    MT_PositionJump
  977.     cmpi.b    #$d,d0
  978.     beq.s    MT_PatternBreak
  979.     cmpi.b    #$e,d0
  980.     beq.s    MT_E_Commands
  981.     cmpi.b    #$f,d0
  982.     beq.s    MT_SetSpeed
  983.     cmpi.b    #$c,d0
  984.     beq    MT_VolumeChange
  985.     bra    MT_PerNop
  986.  
  987. MT_E_Commands:
  988.     move.b    N_Cmdlo(a4),d0
  989.     andi.b    #$f0,d0
  990.     lsr.b    #4,d0
  991.     beq.s    MT_FilterOnOff
  992.     cmpi.b    #1,d0
  993.     beq    MT_FinePortaUp
  994.     cmpi.b    #2,d0
  995.     beq    MT_FinePortaDown
  996.     cmpi.b    #3,d0
  997.     beq.s    MT_SetGlissControl
  998.     cmpi.b    #4,d0
  999.     beq    MT_SetVibratoControl
  1000.     cmpi.b    #5,d0
  1001.     beq    MT_SetFineTune
  1002.     cmpi.b    #6,d0
  1003.     beq    MT_JumpLoop
  1004.     cmpi.b    #7,d0
  1005.     beq    MT_SetTremoloControl
  1006.     cmpi.b    #9,d0
  1007.     beq    MT_RetrigNote
  1008.     cmpi.b    #$a,d0
  1009.     beq    MT_VolumeFineUp
  1010.     cmpi.b    #$b,d0
  1011.     beq    MT_VolumeFineDown
  1012.     cmpi.b    #$c,d0
  1013.     beq    MT_NoteCut
  1014.     cmpi.b    #$d,d0
  1015.     beq    MT_NoteDelay
  1016.     cmpi.b    #$e,d0
  1017.     beq    MT_PatternDelay
  1018.     cmpi.b    #$f,d0
  1019.     beq    MT_FunkIt
  1020.     rts
  1021.  
  1022. MT_FilterOnOff:
  1023.     move.b    N_Cmdlo(a4),d0
  1024.     andi.b    #1,d0
  1025.     add.b    d0,d0
  1026.     andi.b    #$fd,$bfe001
  1027.     or.b    d0,$bfe001
  1028.     rts
  1029.  
  1030. MT_SetGlissControl:
  1031.     move.b    N_Cmdlo(a4),d0
  1032.     andi.b    #$0f,d0
  1033.     andi.b    #$f0,N_GlissFunk(a4)
  1034.     or.b    d0,N_GlissFunk(a4)
  1035.     rts
  1036.  
  1037. MT_SetVibratoControl:
  1038.     move.b    N_Cmdlo(a4),d0
  1039.     andi.b    #$0f,d0
  1040.     andi.b    #$f0,N_WaveControl(a4)
  1041.     or.b    d0,N_WaveControl(a4)
  1042.     rts
  1043.  
  1044. MT_SetFineTune:
  1045.     move.b    N_Cmdlo(a4),d0
  1046.     andi.b    #$0f,d0
  1047.     move.b    d0,N_FineTune(a4)
  1048.     rts
  1049.  
  1050. MT_JumpLoop:
  1051.     tst.b    MT_Counter(a5)
  1052.     bne    MT_Return2
  1053.     move.b    N_Cmdlo(a4),d0
  1054.     andi.b    #$0f,d0
  1055.     beq.s    MT_SetLoop
  1056.     tst.b    N_LoopCount(a4)
  1057.     beq.s    MT_JumpCnt
  1058.     subq.b    #1,N_LoopCount(a4)
  1059.     beq    MT_Return2
  1060. MT_JmpLoop:
  1061.     move.b    N_PattPos(a4),MT_PBreakPos(a5)
  1062.     st    MT_PBreakFlag(a5)
  1063.     rts
  1064.  
  1065. MT_JumpCnt:
  1066.     move.b    d0,N_LoopCount(a4)
  1067.     bra.s    MT_JmpLoop
  1068.  
  1069. MT_SetLoop:
  1070.     move.w    MT_PatternPos(a5),d0
  1071.     lsr.w    #4,d0
  1072.     move.b    d0,N_PattPos(a4)
  1073.     rts
  1074.  
  1075. MT_SetTremoloControl:
  1076.     move.b    N_Cmdlo(a4),d0
  1077. ; *     andi.b    #$0f,d0
  1078.     lsl.b    #4,d0
  1079.     andi.b    #$0f,N_WaveControl(a4)
  1080.     or.b    d0,N_WaveControl(a4)
  1081.     rts
  1082.  
  1083. MT_RetrigNote:
  1084.     move.l    d1,-(sp)
  1085.     moveq    #0,d0
  1086.     move.b    N_Cmdlo(a4),d0
  1087.     andi.b    #$0f,d0
  1088.     beq.s    MT_RtnEnd
  1089.     moveq    #0,d1
  1090.     move.b    MT_Counter(a5),d1
  1091.     bne.s    MT_RtnSkp
  1092.     move.w    (a4),d1
  1093.     andi.w    #$0fff,d1
  1094.     bne.s    MT_RtnEnd
  1095.     moveq    #0,d1
  1096.     move.b    MT_Counter(a5),d1
  1097. MT_RtnSkp:
  1098.     divu    d0,d1
  1099.     swap    d1
  1100.     tst.w    d1
  1101.     bne.s    MT_RtnEnd
  1102. MT_DoRetrig:
  1103.     move.w    N_DMABit(a4),$096(a6)    ; Channel DMA off
  1104.     move.l    N_Start(a4),0(a6,d5.w)    ; Set sampledata pointer
  1105.     move.w    N_Length(a4),4(a6,d5.w)    ; Set length
  1106.     bsr    MT_DMAWaitLoop
  1107.     move.w    N_DMABit(a4),d0
  1108.     ori.w    #$8000,d0
  1109. ; *     bset    #15,d0
  1110.     move.w    d0,$096(a6)
  1111.     bsr    MT_DMAWaitLoop
  1112.     move.l    N_LoopStart(a4),0(a6,d5.w)
  1113.     move.l    N_Replen(a4),4(a6,d5.w)
  1114. MT_RtnEnd:
  1115.     move.l    (sp)+,d1
  1116.     rts
  1117.  
  1118. MT_VolumeFineUp:
  1119.     tst.b    MT_Counter(a5)
  1120.     bne    MT_Return2
  1121.     moveq    #0,d0
  1122.     move.b    N_Cmdlo(a4),d0
  1123.     andi.b    #$d,d0
  1124.     bra    MT_VolSlideUp
  1125.  
  1126. MT_VolumeFineDown:
  1127.     tst.b    MT_Counter(a5)
  1128.     bne    MT_Return2
  1129.     moveq    #0,d0
  1130.     move.b    N_Cmdlo(a4),d0
  1131.     andi.b    #$0f,d0
  1132.     bra    MT_VolSlideDown2
  1133.  
  1134. MT_NoteCut:
  1135.     moveq    #0,d0
  1136.     move.b    N_Cmdlo(a4),d0
  1137.     andi.b    #$0f,d0
  1138.     cmp.b    MT_Counter(a5),d0   ; was cmpi!!!
  1139.     bne    MT_Return2
  1140.     clr.b    N_Volume(a4)
  1141.     clr.w    8(a6,d5.w)
  1142.     rts
  1143.  
  1144. MT_NoteDelay:
  1145.     moveq    #0,d0
  1146.     move.b    N_Cmdlo(a4),d0
  1147.     andi.b    #$0f,d0
  1148.     cmp.b    MT_Counter(a5),d0   ; was cmpi!!!
  1149.     bne    MT_Return2
  1150.     move.w    (a4),d0
  1151.     beq    MT_Return2
  1152.     move.l    d1,-(sp)
  1153.     bra    MT_DoRetrig
  1154.  
  1155. MT_PatternDelay:
  1156.     tst.b    MT_Counter(a5)
  1157.     bne    MT_Return2
  1158.     moveq    #0,d0
  1159.     move.b    N_Cmdlo(a4),d0
  1160.     andi.b    #$0f,d0
  1161.     tst.b    MT_PattDelTime2(a5)
  1162.     bne    MT_Return2
  1163.     addq.b    #1,d0
  1164.     move.b    d0,MT_PattDelTime(a5)
  1165.     rts
  1166.  
  1167. MT_FunkIt:
  1168.     tst.b    MT_Counter(a5)
  1169.     bne    MT_Return2
  1170.     move.b    N_Cmdlo(a4),d0
  1171. ; *     andi.b    #$0f,d0
  1172.     lsl.b    #4,d0
  1173.     andi.b    #$0f,N_GlissFunk(a4)
  1174.     or.b    d0,N_GlissFunk(a4)
  1175.     tst.b    d0
  1176.     beq    MT_Return2
  1177. MT_UpdateFunk:
  1178.     movem.l    a0/d1,-(sp)
  1179.     moveq    #0,d0
  1180.     move.b    N_GlissFunk(a4),d0
  1181.     lsr.b    #4,d0
  1182.     beq.s    MT_FunkEnd
  1183.     lea    MT_FunkTable(pc),a0
  1184.     move.b    0(a0,d0.w),d0
  1185.     add.b    d0,N_FunkOffset(a4)
  1186.     btst    #7,N_FunkOffset(a4)
  1187.     beq.s    MT_FunkEnd
  1188.     clr.b    N_FunkOffset(a4)
  1189.  
  1190.     move.l    N_LoopStart(a4),d0
  1191.     moveq    #0,d1
  1192.     move.w    N_Replen(a4),d1
  1193.     add.l    d1,d0
  1194.     add.l    d1,d0
  1195.     move.l    N_WaveStart(a4),a0
  1196.     addq.w    #1,a0
  1197.     cmp.l    d0,a0
  1198.     blo.s    MT_FunkOk
  1199.     move.l    N_LoopStart(a4),a0
  1200. MT_FunkOk:
  1201.     move.l    a0,N_WaveStart(a4)
  1202.     moveq    #-1,d0
  1203.     sub.b    (a0),d0
  1204.     move.b    d0,(a0)
  1205. MT_FunkEnd:
  1206.     movem.l    (sp)+,a0/d1
  1207.     rts
  1208.  
  1209. MT_DMAWaitLoop:
  1210.     move.w    d1,-(sp)
  1211.     moveq    #5,d0        ; wait 5+1 lines
  1212. loop:   move.b    6(a6),d1    ; read current raster position
  1213. wait:   cmp.b    6(a6),d1
  1214.     beq.s    wait        ; wait until it changes
  1215.     dbf    d0,loop        ; do it again
  1216.     move.w    (sp)+,d1
  1217.     rts
  1218.  
  1219.  
  1220. MT_FunkTable: dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1221.  
  1222. MT_VibratoTable:
  1223.     dc.b 0,24,49,74,97,120,141,161
  1224.     dc.b 180,197,212,224,235,244,250,253
  1225.     dc.b 255,253,250,244,235,224,212,197
  1226.     dc.b 180,161,141,120,97,74,49,24
  1227.  
  1228. MT_PeriodTable:
  1229. ; Tuning 0, Normal
  1230.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1231.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1232.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1233. ; Tuning 1
  1234.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1235.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1236.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1237. ; Tuning 2
  1238.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1239.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1240.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1241. ; Tuning 3
  1242.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1243.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1244.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1245. ; Tuning 4
  1246.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1247.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1248.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1249. ; Tuning 5
  1250.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1251.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1252.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1253. ; Tuning 6
  1254.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1255.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1256.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1257. ; Tuning 7
  1258.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1259.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1260.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1261. ; Tuning -8
  1262.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1263.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1264.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1265. ; Tuning -7
  1266.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1267.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1268.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1269. ; Tuning -6
  1270.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1271.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1272.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1273. ; Tuning -5
  1274.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1275.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1276.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1277. ; Tuning -4
  1278.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1279.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1280.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1281. ; Tuning -3
  1282.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1283.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1284.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1285. ; Tuning -2
  1286.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1287.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1288.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1289. ; Tuning -1
  1290.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1291.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1292.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1293.  
  1294. MT_Chan1Temp:
  1295.     dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1296. MT_Chan2Temp:
  1297.     dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1298. MT_Chan3Temp:
  1299.     dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1300. MT_Chan4Temp:
  1301.     dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1302. MT_SampleStarts:
  1303.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1304.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1305. *MT_SongDataPtr:
  1306.     dc.l 0
  1307. *MT_Speed:
  1308.     dc.b 6
  1309. *MT_Counter:
  1310.     dc.b 0
  1311. *MT_SongPos:
  1312.     dc.b 0
  1313. *MT_PBreakPos:
  1314.     dc.b 0
  1315. *MT_PosJumpFlag:
  1316.     dc.b 0
  1317. *MT_PBreakFlag:
  1318.     dc.b 0
  1319. *MT_LowMask:
  1320.     dc.b 0
  1321. *MT_PattDelTime:
  1322.     dc.b 0
  1323. *MT_PattDelTime2:
  1324.     dc.b 0,0
  1325. *MT_PatternPos:
  1326.     dc.w 0
  1327. *MT_DMACONtemp:
  1328.     dc.w 0
  1329. Variables:
  1330.  
  1331. intnode:
  1332.                 dc.l    0,0
  1333.                 dc.b    2,0
  1334.                 dc.l    intname,0,MT_Call
  1335. intname:
  1336.                 dc.b    "ST.spobject",0
  1337. _LM_FileHandle: dc.l    0
  1338.  
  1339.                 cnop 0,4
  1340.  
  1341.         XDEF _ST_FreeModule
  1342.         XDEF _ST_IsPlaying
  1343.         XDEF _ST_UnLoadModule
  1344.         XDEF _ST_Start
  1345.         XDEF _ST_Stop
  1346.  
  1347.         END
  1348.